/*
 * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software;Designed and Developed mainly by many Chinese
 * opensource volunteers. you can redistribute it and/or modify it under the
 * terms of the GNU General Public License version 2 only, as published by the
 * Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Any questions about this component can be directed to it's project Web address
 * https://code.google.com/p/opencloudb/.
 *
 */
package io.mycat.server.config.node;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.mycat.backend.PhysicalDBPool;

/**
 * Datahost is a group of DB servers which is synchronized with each other
 *
 * @author wuzhih
 */
public class DataHostConfig {
    public static final int NOT_SWITCH_DS = -1;
    public static final int DEFAULT_SWITCH_DS = 1;
    public static final int SYN_STATUS_SWITCH_DS = 2;
    private static final Pattern pattern = Pattern.compile("\\s*show\\s+slave\\s+status\\s*", Pattern.CASE_INSENSITIVE);
    private String dbType;
    private String dbDriver;
    private int switchType;
    private DBHostConfig[] writeHosts;
    private Map<Integer, DBHostConfig[]> readHosts;
    private String name;
    private int maxCon = SystemConfig.DEFAULT_POOL_SIZE;
    private int minCon = 10;
    private int balance = PhysicalDBPool.BALANCE_NONE;
    private int writeType = PhysicalDBPool.WRITE_ONLYONE_NODE;
    private String heartbeatSQL;
    private boolean isShowSlaveSql = false;
    private String connectionInitSql;
    private int slaveThreshold = -1;
    private String filters = "mergeStat";
    private long logTime = 300000;
    private boolean tempReadHostAvailable = false;  //如果写服务挂掉, 临时读服务是否继续可用

    public DataHostConfig() {
        super();
    }

    public DataHostConfig(String name, String dbType, String dbDriver,
                          DBHostConfig[] writeHosts, Map<Integer, DBHostConfig[]> readHosts, int switchType, int slaveThreshold, boolean tempReadHostAvailable) {
        super();
        this.name = name;
        this.dbType = dbType;
        this.dbDriver = dbDriver;
        this.writeHosts = writeHosts;
        this.readHosts = readHosts;
        this.switchType = switchType;
        this.slaveThreshold = slaveThreshold;
        this.tempReadHostAvailable = tempReadHostAvailable;
    }
    
	public boolean isTempReadHostAvailable() {
		return this.tempReadHostAvailable;
	}

    public int getSlaveThreshold() {
        return slaveThreshold;
    }

    public void setSlaveThreshold(int slaveThreshold) {
        this.slaveThreshold = slaveThreshold;
    }

    public int getSwitchType() {
        return switchType;
    }

    public String getConnectionInitSql() {
        return connectionInitSql;
    }

    public void setConnectionInitSql(String connectionInitSql) {
        this.connectionInitSql = connectionInitSql;
    }

    public int getWriteType() {
        return writeType;
    }

    public void setWriteType(int writeType) {
        this.writeType = writeType;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMaxCon() {
        return maxCon;
    }

    public void setMaxCon(int maxCon) {
        this.maxCon = maxCon;
    }

    public int getMinCon() {
        return minCon;
    }

    public void setMinCon(int minCon) {
        this.minCon = minCon;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public String getDbType() {
        return dbType;
    }

    public String getDbDriver() {
        return dbDriver;
    }

    public DBHostConfig[] getWriteHosts() {
        return writeHosts;
    }

    public Map<Integer, DBHostConfig[]> getReadHosts() {
        return readHosts;
    }

    public String getHeartbeatSQL() {
        return heartbeatSQL;
    }

    public void setHeartbeatSQL(String heartbeatSQL) {
        this.heartbeatSQL = heartbeatSQL;
        Matcher matcher = pattern.matcher(heartbeatSQL);
        if (matcher.find()) {
            isShowSlaveSql = true;
        }
    }

    public boolean isShowSlaveSql() {
        return isShowSlaveSql;
    }

    public String getFilters() {
        return filters;
    }

    public void setFilters(String filters) {
        this.filters = filters;
    }

    public long getLogTime() {
        return logTime;
    }

    public void setLogTime(long logTime) {
        this.logTime = logTime;
    }

    public void setDbType(String dbType) {
        this.dbType = dbType;
    }

    public void setDbDriver(String dbDriver) {
        this.dbDriver = dbDriver;
    }

    public void setSwitchType(int switchType) {
        this.switchType = switchType;
    }

    public void setWriteHosts(DBHostConfig[] writeHosts) {
        this.writeHosts = writeHosts;
    }

    public void setReadHosts(Map<Integer, DBHostConfig[]> readHosts) {
        this.readHosts = readHosts;
    }

    public void setIsShowSlaveSql(boolean isShowSlaveSql) {
        this.isShowSlaveSql = isShowSlaveSql;
    }
}